package org.herui.campus.util;

import com.fasterxml.jackson.annotation.JsonProperty;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class EnumHandleUtil {

    /**
     * 将枚举类以及其属性转换成Map进行返回
     *
     * @param enumClass
     * @return
     * @throws IllegalAccessException
     */
    public static Map<String, Object> convertEnumToMap(Class<? extends Enum<?>> enumClass) throws IllegalAccessException {
        Map<String, Object> enumMap = new HashMap<>();

        for (Enum<?> enumValue : enumClass.getEnumConstants()) {
            Map<String, Object> valueMap = new HashMap<>();

            // 获取枚举项的所有字段
            Field[] fields = enumValue.getClass().getDeclaredFields();

            for (Field field : fields) {
                field.setAccessible(true);
                // 排除枚举项的默认属性
                if (!field.isEnumConstant() && !field.isSynthetic()) {
                    // 使用 @JsonProperty 注解的属性名作为 JSON 中的键
                    JsonProperty jsonProperty = field.getAnnotation(JsonProperty.class);
                    String key = (jsonProperty != null) ? jsonProperty.value() : field.getName();
                    Object value = field.get(enumValue);
                    // 递归处理枚举属性中的枚举对象
                    if (value != null && value.getClass().isArray() && value.getClass().getComponentType().isEnum()) {
                        Enum<?>[] enumArray = (Enum<?>[]) value;
                        if (enumArray.length > 0)
                            value = convertEnumToMap((Class<? extends Enum<?>>) enumArray[0].getClass());
                        else
                            continue;
                    } else if (value != null && value.getClass().isEnum()) {
                        value = convertEnumToMap((Class<? extends Enum<?>>) value.getClass());
                    }
                    valueMap.put(key, value);
                }
            }
            enumMap.put(enumValue.name(), valueMap);
        }
        return enumMap;
    }
}
